package com.atguigu.tingshu.cdc.hander;

import com.atguigu.tingshu.cdc.entity.CDCEntity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import top.javatool.canal.client.annotation.CanalTable;
import top.javatool.canal.client.handler.EntryHandler;

@Component
@CanalTable("album_info") //监听变更表
public class CdcEntryHandler implements EntryHandler<CDCEntity> {

    @Autowired
    private StringRedisTemplate redisTemplate;


    /**
     * 当album_info表有数据新增 此时会回掉到insert方法  并且回调的时候将canal获取到的数据给客户端
     *
     * @param cdcEntity
     */
    @Override
    public void insert(CDCEntity cdcEntity) {
        System.out.println("插入的新数据：" + cdcEntity);
    }

    /**
     * 当album_info表有数据修改(修改) 此时会回掉到update方法  并且回调的时候将canal获取到的新老数据给客户端
     *
     * @param before：修改之前的数据
     * @param after：修改之后的数据
     */
    @Override
    public void update(CDCEntity before, CDCEntity after) {

        try {
            try {
                Thread.sleep(500);   // 压测得到读线程读数据库+同步缓存时间（300）
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            String cacheKey = "cache:info:" + after.getId();
            redisTemplate.delete(cacheKey);
        } catch (RuntimeException e) {
            // TODO
            // 发送缓存key给rabbitmq 完成重试删除redis逻辑
        }


    }

    @Override
    public void delete(CDCEntity cdcEntity) {
        System.out.println("删除之前的数据：" + cdcEntity);
    }


}